home *** CD-ROM | disk | FTP | other *** search
- unit RASCountryList;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
-
- type
- TRASCountryList = class (TComponent)
- private
- { Private declarations }
- fCountries, fDummy1: TStrings;
- fCountryName: String;
- fCountryDialCode, fCountryID, fDummy2: Integer;
- procedure SetCountryID (Value: Integer);
- procedure SetCountryName (const Value: String);
- protected
- { Protected declarations }
- public
- { Public declarations }
- constructor Create (AOwner: TComponent); override;
- destructor Destroy; override;
- procedure Refresh;
- published
- { Published declarations }
- property Countries: TStrings read fCountries write fDummy1 stored False;
- property CountryName: String read fCountryName write SetCountryName;
- property CountryDialCode: Integer read fCountryDialCode write fDummy2;
- property CountryID: Integer read fCountryID write SetCountryID;
- end;
-
- procedure Register;
-
- implementation
-
- uses Registry;
-
- constructor TRASCountryList.Create (AOwner: TComponent);
- begin
- Inherited Create (AOwner);
- fCountries := TStringList.Create;
- Refresh;
- // Why should the US have everything it's way? :-)
- SetCountryName ('United Kingdom');
- end;
-
- destructor TRASCountryList.Destroy;
- begin
- fCountries.Free;
- Inherited Destroy;
- end;
-
- procedure TRASCountryList.Refresh;
- const
- CListReg = '\SOFTWARE\Microsoft\Windows\CurrentVersion\Telephony\Country List';
- var
- Idx: Integer;
- Reg: TRegistry;
- ObjectData: Integer;
- IDNames: TStringList;
- begin
- Reg := TRegistry.Create;
- try
- Reg.RootKey := hKey_Local_Machine;
- if Reg.OpenKey (CListReg, False) then begin
- fCountries.Clear;
- // Set Sorted = False for speed....
- TStringList (fCountries).Sorted := False;
- IDNames := TStringList.Create;
- try
- Reg.GetKeyNames (IDNames);
- for Idx := 0 to IDNames.Count - 1 do
- if Reg.OpenKey (CListReg + '\' + IDNames [Idx], False) then begin
- ObjectData := MakeLong (Reg.ReadInteger ('CountryCode'), StrToInt (IDNames [Idx]));
- fCountries.AddObject (Reg.ReadString ('Name'), TObject (ObjectData));
- end;
- finally
- IDNames.Free;
- TStringList (fCountries).Sorted := True;
- end;
- end;
- finally
- Reg.Free;
- end;
- end;
-
- procedure TRASCountryList.SetCountryName (const Value: String);
- var
- Idx: Integer;
- begin
- Idx := fCountries.IndexOf (Value);
- if Idx <> -1 then begin
- fCountryName := fCountries [Idx];
- fCountryDialCode := Integer (fCountries.Objects [Idx]) and $ffff;
- fCountryID := Integer (fCountries.Objects [Idx]) shr 16;
- end;
- end;
-
- procedure TRASCountryList.SetCountryID (Value: Integer);
- var
- Idx: Integer;
- begin
- for Idx := 0 to fCountries.Count - 1 do
- if Value = Integer (fCountries.Objects [Idx]) shr 16 then begin
- SetCountryName (fCountries [Idx]);
- Exit;
- end;
- end;
-
- procedure Register;
- begin
- RegisterComponents ('DelphiMag', [TRASCountryList]);
- end;
-
- end.
-